package com.hyou.springboot.util;

import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;

import javax.crypto.spec.SecretKeySpec;

import org.springframework.util.CollectionUtils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

/**
 * JWT处理工具类。
 * 
 * @author FengChangshuo
 * @version 1.0.0 2018-04-18 11:52:48 初始创建
 */
public class JwtUtil {
    
    private JwtUtil() {
    }
    
    /**
     * <pre>
     * 生成JWT Token
     * 
     * 版本修改历史记录：
     * 1) 1.0.0 2018-04-18 11:32:33 FengChangshuo 初始创建
     * </pre>
     * 
     * @param claims JWT载荷部分内容
     * @param keySecret 加密密钥
     * @param expirationSeconds Tokent过期时间，单位：秒
     * @return JWT token
     */
    public static String createJwtToken(Map<String, Object> claims, String keySecret, int expirationSeconds) {
        JwtBuilder builder = Jwts.builder();
        
        Map<String, Object> headerMap = new HashMap<>();
        headerMap.put("alg", SignatureAlgorithm.HS256.getValue());
        headerMap.put("typ", "JWT");
        builder.setHeaderParams(headerMap);
        
        if (!CollectionUtils.isEmpty(claims)) {
            builder.addClaims(claims);
        }
        
        Calendar cal = Calendar.getInstance();
        
        // token生成时间
        builder.setIssuedAt(cal.getTime());
        
        // token过期时间
        cal.add(Calendar.SECOND, expirationSeconds);
        builder.setExpiration(cal.getTime());
        
        SecretKeySpec secretKeySpec = new SecretKeySpec(keySecret.getBytes(), SignatureAlgorithm.HS256.getJcaName());
        return builder.signWith(SignatureAlgorithm.HS256, secretKeySpec).compact();
    }
    
    /**
     * <pre>
     * 解析JWT Token，获取其载荷部分的数据内容
     * 
     * 版本修改历史记录：
     * 1) 1.0.0 2018-04-18 11:41:19 FengChangshuo 初始创建
     * </pre>
     * 
     * @param token JWT token
     * @param keySecret 加密密钥
     * @return 载荷部分的数据对象
     */
    public static Claims parseJwtToken(String token, String keySecret) {
        SecretKeySpec secretKeySpec = new SecretKeySpec(keySecret.getBytes(), SignatureAlgorithm.HS256.getJcaName());
        return Jwts.parser().setSigningKey(secretKeySpec).parseClaimsJws(token).getBody();
    }
    
}
